package com.yy.distributed.spring.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * Write your description here...
 *
 * @author dinghuan
 * @date 2018/7/19
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DistributedLock {
    /**
     * 锁名
     * 为空时，切参数未注解 LockName时，默认为：类名.方法名
     *
     * @return
     * @see LockName 参数注解获取key
     */
    String lockName() default "";

    /**
     * lockName后缀
     */
    String lockNamePre() default "dLock";

    /**
     * lockName后缀
     */
    String lockNamePost() default "";

    /**
     * 获得锁名时拼接前后缀用到的分隔符
     *
     * @return
     */
    String separator() default ".";

    /**
     * 自动释放锁
     *
     * @return
     */
    boolean release() default true;

    /**
     * 是否使用公平锁。
     * 公平锁即先来先得。
     */
    boolean fairLock() default false;

    /**
     * 是否使用尝试锁。
     */
    boolean tryLock() default false;

    /**
     * 最长等待时间。
     * 该字段只有当tryLock()返回true才有效。
     */
    long waitTime() default 5L;

    /**
     * 锁超时时间。
     * 超时时间过后，锁自动释放。
     * 建议：
     * 尽量缩简需要加锁的逻辑。
     */
    long leaseTime() default 30L;

    /**
     * 时间单位。默认为秒。
     */
    TimeUnit timeUnit() default TimeUnit.SECONDS;

}
